const util = require('./index');
const fileUtil = require('./utils/fileUtil');
const mail = require('./utils/mail');
const dnsService = require('./dnsService');

/**
 * @param {*} wsClient ：websocket客户端，用于将输出实时推送到页面
 */
async function deploy(wsClient) {
  // 首先查询该地区的下面的所有实例
  let result = await util.queryInstances();
  wsClient.send(`查询实例列表成功，当前存活实例数量为：${result.TotalCount}，开始删除这些实例... `);
  wsClient.send('实例正在删除...');
  // 删除所有的实例
  if (result.TotalCount > 0) {
    const instanceIds = result.Instances.Instance.map((ele) => ele.InstanceId);
    console.log(instanceIds);
    await util.deleteInstance(instanceIds);
    wsClient.send(`删除实例成功，删除了${result.TotalCount}个实例`);
    wsClient.send('开始创建新的实例...');
  } else {
    wsClient.send('没有实例，开始创建实例...');
  }
  // 创建一个新的实例
  result = await util.runInstance();
  wsClient.send('创建实例完成，正在启动实例...');
  // 查询该实例的IP
  result = await queryDetail(result.InstanceIdSets.InstanceIdSet);
  console.log('查询实例完成，result', JSON.stringify(result, null, 2));
  const ip = result.Instances.Instance[0].PublicIpAddress.IpAddress[0];
  fileUtil.writeLine(`${ip}`);
  // 发送邮件通知
  const deployRecord = fileUtil.readFile();
  const mailContent = `<div>
  新的服务器已发布，IP为：${ip} 
  <p>历史已发布IP为：</p>
  <pre>${deployRecord}</pre>
  </div>
  `;
  mail.send('SSR发布通知', mailContent);
  wsClient.send(`实例已经启动，ip为 < ${ip} >。正在修改域名ssr.youyi.asia的DNS记录...`);
  const dnsRes = await dnsService.modifyDns(ip);
  wsClient.send(`域名DNS记录修改完毕：${dnsRes.status.message}`);
}

async function deployByCron() {
  // 首先查询该地区的下面的所有实例
  let result = await util.queryInstances();
  // 删除所有的实例
  if (result.TotalCount > 0) {
    const instanceIds = result.Instances.Instance.map((ele) => ele.InstanceId);
    console.log(instanceIds);
    await util.deleteInstance(instanceIds);
  } else {
    console.log('没有实例，开始创建实例...');
  }
  // 创建一个新的实例
  result = await util.runInstance();
  console.log('创建实例完成，正在启动实例...');
  // 查询该实例的IP
  result = await queryDetail(result.InstanceIdSets.InstanceIdSet);
  console.log('查询实例完成，result', JSON.stringify(result, null, 2));
  const ip = result.Instances.Instance[0].PublicIpAddress.IpAddress[0];
  fileUtil.writeLine(`${ip}`);
  console.log(`实例已经启动，ip为 < ${ip} >。正在修改域名ssr.youyi.asia的DNS记录...`);
  const dnsRes = await dnsService.modifyDns(ip);
  console.log(`域名DNS记录修改完毕：${dnsRes.status.message}`);
}

// 递归查询，1秒1次，一直查询到有结果为止，此时说明实例已经创建完成并且已经完成IP地址的分配，可以连接
async function queryDetail(idsArray) {
  const result = await util.queryInstanceDetail(idsArray);
  if (result.Instances.Instance.length > 0 && result.Instances.Instance[0].PublicIpAddress.IpAddress.length > 0) {
    return result;
  }
  console.log('当前实例尚未初始化，1s后重新查询');
  return new Promise((resolve) => {
    setTimeout(async () => {
      const r = await queryDetail(idsArray);
      resolve(r);
    }, 1000);
  });
}

module.exports = {
  deploy,
  deployByCron,
};
